#include"seq_list.h"

//顺序表的初始化
void SLInit(SL *ps)
{
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}

//检查 扩容
void SLCheckCapacity(SL* ps)
{
    assert(ps);  // 防空指针

    // 如果当前空间已满，才需要扩容
    if (ps->size == ps->capacity)
    {
        // 计算新容量：如果当前为0，初始给4；否则翻倍（三目操作符）
        int newCapacity = (ps->capacity == 0) ? 4 : (ps->capacity * 2);

        // 使用临时指针接收 realloc 结果，防止原指针丢失
        SLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapacity * sizeof(SLDataType));

        // 检查扩容是否成功
        if (tmp == NULL)
        {
            printf("realloc fail! Not enough memory.\n");
            exit(-1);  // 终止程序（实际项目中可返回错误码）
        }

        // 扩容成功，更新结构体成员
        ps->arr = tmp;              // 指向新空间
        ps->capacity = newCapacity; // 更新容量
        // ps->size 不变，仍是原来的有效元素个数
    }
    // 如果没满，什么都不做，直接返回

}
void SLDestroy(SL* ps)
{
	if (ps->arr) //等价于  if(ps->arr != NULL)
	{
		free(ps->arr);
	}
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}

//尾插
void SLPushBack(SL* ps, SLDataType x)
{
	assert(ps); 
	SLCheckCapacity(ps);
	ps->arr[ps->size++] = x;
}

//查找
// int SLFind(SL* ps, SLDataType x)
// {
// 	assert(ps);
// 	for (int i = 0; i < ps->size; i++)
// 	{
// 		if (ps->arr[i] == x)
// 		{
// 			//找到啦
// 			return i;
// 		}
// 	}
// 	//没有找到
// 	return -1;
// }